﻿#include <iostream>
#include <sstream>
#include <string>
#include <curl/curl.h>

const static std::string request_url = "https://aip.baidubce.com/rest/2.0/ocr/v1/accurate_basic";
static std::string accurateBasic_result;
/**
* curl发送http请求调用的回调函数，回调函数中对返回的json格式的body进行了解析，解析结果储存在全局的静态变量当中
* @param 参数定义见libcurl文档
* @return 返回值定义见libcurl文档
*/
static size_t callback(void *ptr, size_t size, size_t nmemb, void *stream) {
    // 获取到的body存放在ptr中，先将其转换为string格式
    accurateBasic_result = std::string((char *) ptr, size * nmemb);
    return size * nmemb;
}
/**
* 通用文字识别（高精度版）
* @return 调用成功返回0，发生错误返回其他错误码
*/
int accurateBasic(std::string &json_result, const std::string &access_token) {
    // 构造请求URL
    std::string url = request_url + "?access_token=" + access_token;
    // 初始化CURL
    CURL *curl = NULL;
    CURLcode result_code;
    int is_success;
    curl = curl_easy_init();
    // 判断CURL是否初始化成功
    if (curl) {
        // 设置请求URL
        curl_easy_setopt(curl, CURLOPT_URL, url.data());
        // 设置请求方法为POST
        curl_easy_setopt(curl, CURLOPT_POST, 1);
        // 构造POST数据
        curl_httppost *post = NULL;
        curl_httppost *last = NULL;
        curl_formadd(&post, &last, CURLFORM_COPYNAME, "image", CURLFORM_COPYCONTENTS, "【base64_img】", CURLFORM_END);

        // 设置POST数据
        curl_easy_setopt(curl, CURLOPT_HTTPPOST, post);
        // 设置回调函数
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, callback);
        // 执行请求
        result_code = curl_easy_perform(curl);
        // 判断请求是否成功
        if (result_code != CURLE_OK) {
            // 输出错误信息
            fprintf(stderr, "curl_easy_perform() failed: %s\n",
                    curl_easy_strerror(result_code));
            // 设置返回值为1，表示请求失败
            is_success = 1;
            return is_success;
        }
        // 将结果赋值给json_result
        json_result = accurateBasic_result;
        // 清理CURL
        curl_easy_cleanup(curl);
        // 设置返回值为0，表示请求成功
        is_success = 0;
    } else {
        // 输出错误信息
        fprintf(stderr, "curl_easy_init() failed.");
        // 设置返回值为1，表示请求失败
        is_success = 1;
    }
    // 返回返回值
    return is_success;
}